package storage

import (
	"errors"
	"fmt"
	"path/filepath"

	"gitee.com/war2001/NiuMaEasyGo/config"
)

// NewStorageFromConfig 从配置创建存储管理器
func NewStorageFromConfig(cfg *config.StorageSettings) (*Manager, error) {
	if cfg == nil {
		return nil, errors.New("存储配置不能为空")
	}

	var storage Storage
	var err error

	switch cfg.Provider {
	case "local":
		// 创建本地存储配置
		localConfig := &LocalConfig{
			RootPath:   cfg.Local.RootPath,
			BaseURL:    cfg.Local.BaseURL,
			CreatePath: cfg.Local.CreatePath,
		}

		// 创建本地存储
		storage, err = NewLocalStorage(localConfig)
		if err != nil {
			return nil, fmt.Errorf("创建本地存储失败: %w", err)
		}

	case "oss":
		// 创建阿里云OSS存储配置
		ossConfig := &OSSConfig{
			AccessKeyID:     cfg.OSS.AccessKeyID,
			AccessKeySecret: cfg.OSS.AccessKeySecret,
			Endpoint:        cfg.OSS.Endpoint,
			Bucket:          cfg.OSS.Bucket,
			BaseURL:         cfg.OSS.BaseURL,
			PathPrefix:      cfg.OSS.PathPrefix,
			IsPublic:        cfg.OSS.IsPublic,
		}

		// 创建阿里云OSS存储
		storage, err = NewOSSStorage(ossConfig)
		if err != nil {
			return nil, fmt.Errorf("创建阿里云OSS存储失败: %w", err)
		}

	case "cos":
		// 创建腾讯云COS存储配置
		cosConfig := &COSConfig{
			SecretID:    cfg.COS.SecretID,
			SecretKey:   cfg.COS.SecretKey,
			Region:      cfg.COS.Region,
			Bucket:      cfg.COS.Bucket,
			BaseURL:     cfg.COS.BaseURL,
			PathPrefix:  cfg.COS.PathPrefix,
			IsPublic:    cfg.COS.IsPublic,
			Timeout:     30,               // 默认30秒超时
			MaxFileSize: 50 * 1024 * 1024, // 默认最大50MB
		}

		// 创建腾讯云COS存储
		storage, err = NewCOSStorage(cosConfig)
		if err != nil {
			return nil, fmt.Errorf("创建腾讯云COS存储失败: %w", err)
		}

	case "qiniu":
		// 创建七牛云存储配置
		qiniuConfig := &QiniuConfig{
			AccessKey:   cfg.Qiniu.AccessKey,
			SecretKey:   cfg.Qiniu.SecretKey,
			Bucket:      cfg.Qiniu.Bucket,
			Domain:      cfg.Qiniu.Domain,
			PathPrefix:  cfg.Qiniu.PathPrefix,
			IsPublic:    cfg.Qiniu.IsPublic,
			Timeout:     30,               // 默认30秒超时
			MaxFileSize: 50 * 1024 * 1024, // 默认最大50MB
			UseHTTPS:    true,             // 默认使用HTTPS
		}

		// 创建七牛云存储
		storage, err = NewQiniuStorage(qiniuConfig)
		if err != nil {
			return nil, fmt.Errorf("创建七牛云存储失败: %w", err)
		}

	default:
		return nil, fmt.Errorf("不支持的存储提供商: %s", cfg.Provider)
	}

	// 创建存储管理器
	return NewManager(storage)
}

// ValidateFileType 验证文件类型
func ValidateFileType(contentType string, allowedTypes []string) bool {
	if len(allowedTypes) == 0 {
		return true // 如果未指定允许的类型，则允许所有类型
	}

	for _, allowedType := range allowedTypes {
		if contentType == allowedType {
			return true
		}
	}

	return false
}

// ValidateFileSize 验证文件大小
func ValidateFileSize(size int64, maxSize int64) bool {
	if maxSize <= 0 {
		return true // 如果未指定最大大小，则允许所有大小
	}

	return size <= maxSize
}

// GetSafeFilename 获取安全的文件名
func GetSafeFilename(filename string) string {
	// 获取文件扩展名
	ext := filepath.Ext(filename)
	// 获取文件名（不包含扩展名）
	name := filename[:len(filename)-len(ext)]
	// 替换特殊字符
	name = filepath.Clean(name)
	// 重新组合文件名
	return name + ext
}

// GenerateUploadPath 生成上传路径
func GenerateUploadPath(uploadDir, subDir string) string {
	if subDir == "" {
		return uploadDir
	}
	return filepath.Join(uploadDir, subDir)
}
